В этом шаге мы будем обрабатывать движения мыши. Будем выводить жирную точку под курсором мыши. Сделать это в MFC очень просто, но для правильного отображения точки понадобится несколько изменений.
Во-первых создадим проект и настроим его как в предыдущих шагах. Затем надо добавить еще один флаг в структуру PIXELFORMATDESCRIPTOR:
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
Это флаг PFD_DOUBLEBUFFER.
Переменную CDC* pDC стоит сделать членом класса C...View, т.е. внести ее в раздел private этого класса.
Создадим еще пару переменных, которые будут хранить координаты мыши. Назовем их m_XMousePos и m_YMousePos. Теперь добавим обработчик движения мыши, т.е. OnMouseMove:
void CExampleView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CRect rectClient;
GetClientRect(&rectClient);
m_XMousePos = (float)(2*point.x)/(float)(rectClient.right)-1;
m_YMousePos = (float)(2*(rectClient.bottom-point.y))/
(float)(rectClient.bottom)-1;
CView::OnLButtonDown(nFlags, point);
InvalidateRect(NULL, FALSE);
CView::OnMouseMove(nFlags, point);
}
Все, что мы делаем в этом обработчике - это вычисляем координаты мыши в системе координат OpenGL. В конце мы вызываем функцию InvalidateRect(NULL, FALSE). Делаем мы это для того, чтобы перерисовать окно, т.е просим MFC вызвать функцию OnDraw.
Теперь посмотрим изменения в функции OnDraw:
void CExampleView::OnDraw(CDC* pDC)
{
CRect clientRect;
CExampleDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
GetClientRect(&clientRect);
glViewport(0, 0, clientRect.right, clientRect.bottom);
glClearColor (0.5, 0.5, 0.75, 1.0); // цвет фона
glClear (GL_COLOR_BUFFER_BIT); // очистка буфера цвета
glPointSize (30); // размер точек
glColor3f (1.0, 0.0, 0.5); // текущий цвет примитивов
glPointSize(20);
glBegin (GL_POINTS);
glVertex2f(m_XMousePos, m_YMousePos);
glEnd();
glDisable(GL_POINT_SMOOTH);
SwapBuffers(pDC->m_hDC);
}
В целом здесь почти ничего не изменилось, добавили только функцию SwapBuffers(pDC->m_hDC). Её смысл - переключить буффер отображения. Благодаря ей мы можем добиться плавного отображения точки.
Попробуйте убрать флаг PFD_DOUBLEBUFFER и закоментируйте функцию SwapBuffer(...). Что получилось? Правильно, мерцание точки.